/* Standard includes. */
#include <stdio.h>

/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"

/* Library includes. */
#include "stm32f10x.h" // Device header
#include "stm32f10x_it.h"

/* user apps and drivers */
#include "motor_l298n.h"
#include "data_sensor.h"
#include "pid.h"
#include "pwm.h"
#include "encoder.h"
#include "usart.h"

/* user config */
#define IS_SERVO_ANGLE(angle) (0.025 + (90 - ((float)angle)) * (0.125 - 0.025) / 180)
#define IS_TASK_DELAY_MS(ms) ((ms) / portTICK_PERIOD_MS)

#define UART_PACKAGE_TITLE 0xcc
#define UART_PACKAGE_END 0xaa
#define UART_TX_PACKAGE_LEN 4
#define UART_RX_PACKAGE_LEN 1

#define USE_USER_DEBUG 0
#define USE_PACKAGE_TO_DOWNLOAD 0

/* user vaults definition */
u8 uart_upload_package[UART_TX_PACKAGE_LEN], uart_download_package[UART_RX_PACKAGE_LEN];

/* user functions definition */


/* tasks definition */
TaskHandle_t StartTask_Handler;

#if ( USE_USER_DEBUG > 0 )
TaskHandle_t Debug_taskhandle;

void Debug_task(void *param)
{
	while (1)
	{
		// 添加调试代码...
	}
}
#endif

void start_task(void *pvParameters)
{
	taskENTER_CRITICAL(); // 进入临界区

	/* 添加任务 */
	

#if ( USE_USER_DEBUG > 0 )
	xTaskCreate(Debug_task, "Debug_task", 64, NULL, 1, &Debug_taskhandle);
#endif

	vTaskDelete(StartTask_Handler);

	taskEXIT_CRITICAL(); // 退出临界区
}

int main(void)
{
	/* 初始化 */
	/* GPIO init */
	// RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

	// GPIO_InitTypeDef GPIO_InitStructure;
	// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	// GPIO_Init(GPIOA, &GPIO_InitStructure);

	/* usart init */
	

	/* DataSensor init */

	/* user init */


	/* 初始化结束，进入系统 */

	// 创建开始任务
	xTaskCreate((TaskFunction_t)start_task,			 // 任务函数
				(const char *)"start_task",			 // 任务名称
				(uint16_t)128,						 // 任务堆栈大小
				(void *)NULL,						 // 传递给任务函数的参数
				(UBaseType_t)1,						 // 任务优先级
				(TaskHandle_t *)&StartTask_Handler); // 任务句柄
	
	vTaskStartScheduler();							 // 开启任务调度

	return 0;
}

/* 中断服务函数 */
void USART1_IRQHandler(void) // 串口1中断服务程序
{
	uint8_t Res;

	if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{
		Res = USART_ReceiveData(USART1); // 读取接收到的数据

		uart_download_package[0] = Res;
		
	}
}
